const express = require('express');
const router = express.Router();

// 数据库配置文件
const db  = require('../Mysql')
const bcrypt = require('bcrypt');
// 密码加密
const jm = require('bcryptjs')
let sql;


// 导入验证表单的中间件
const expressJoi = require('@escook/express-joi')
//导入验证规则对象
const { Userverify } = require('../Verify/Userverify')

//注册
router.post('/Admin/addUser',(req,res)=>{
    // 获取服务器的用户信息
    const userInfo = req.query
    if (!userInfo.username || !userInfo.password) {
        return res.cc('用户名或密码不合法!')
    }
    sql=`select * from user where username=?`
    // 执行查询
    db.query(sql,[userInfo.username],(err,result)=>{
        if (err){
            return res.send({err}) //查询异常返回报错
        }
        if (result.length>0){
            res.send({msg:'用户名已被占用!'})
        }
        else{
            // 注册操作
            sql=`INSERT INTO user (username,password,nickname,email) VALUES(?,?,?,?);`
            // 对密码加密
            userInfo.password = jm.hashSync(userInfo.password,10)
            db.query(sql,[
                userInfo.username,
                userInfo.password,
                userInfo.nickname,
                userInfo.email
            ],(err,result)=>{
                if (err){
                    console.log('这是err?',err)
                    return res.cc(err)
                }
                if (result.affectedRows !==1){
                    res.cc('注册异常,请稍后再注册!')
                }else{
                    // 成功要指定第二个参数为成功 0
                    res.cc('注册成功',1)
                }
            })
        }
    })
})

// 导入生成JWT字符串的包
const jwt = require('jsonwebtoken')
// 导入用于将客户端发送过来的JWT字符串 , 解析还原成JSON对象的包
const expressjwt = require("express-jwt")
const {query} = require("express");
// 登录
router.post('/Api/Login', (req, res) => {
    // 获取服务器的用户信息
    const userInfo = req.body
    // 定义 SQL 查询 查询账号是否存在
    const sql = `SELECT * FROM user where username=?`;
    // 执行 SQL 查询
    db.query(sql,[userInfo.username],(err,result)=>{
        if (err){
            return res.send({err}) //查询异常返回报错
        }
        if (result.length>0){
            // 获取用户信息
            const user = result[0];
            //账号存在 验证输入的密码与数据库中存储的哈希密码是否匹配
            bcrypt.compare(userInfo.password, user.password, (err, isMatch) => {
                if (err) {
                    return res.cc('密码验证错误');
                }
                if (!isMatch) {
                    return res.cc('用户名或密码错误');
                }
                const token = getToken(user)
                const statusSql = `SELECT * FROM userstatus`;
                db.query(statusSql,(err,result)=>{
                    if (err) {
                        return res.cc(err);
                    }
                    //验证账号状态是否为active---正常
                    if(user.status=='active'){
                        // 登录成功
                        return res.send({
                            status:1,msg: '登录成功',
                            token:token,
                            userInfo: {
                                nickname: user.nickname,
                                user_pic: user.user_pic,
                                root: user.root,
                                userType_id: user.shop_id,
                                user_id: user.id,
                            }
                        });
                    }else{
                        const msg = result.find(item=>item.key==user.status)
                        // 账号状态异常
                        return res.send({
                            status:0,msg: msg.text
                        });
                    }
                })
            });
        }else{
            res.cc('账号不存在',0)
        }
    })
});
// 测试
router.post('/Admin/index',expressJoi(Userverify),(req, res) => {
    res.cc('验证通过',1)
});

const getToken = (user)=>{
    // JWT 密钥
    const secretKey = 'MdsMyu';
    // 生成JWT加密用户信息
    const tokenStr = jwt.sign(
        {user_Id:user.id},
        secretKey,
        {expiresIn:'24h'}
    )
    return tokenStr;
}


// 声明一个中间件
let sesson =(req,res,next)=>{
    next();
}

// 创建路由 并且挂载局部中间件
router.get("/Index",sesson, (req, res) => {
    res.send(req.query);
})

module.exports = router;
